package com.dollar.ruyuan_juc.nonLockImpl.immutable.smsGatewaySystem;

import javax.jnlp.IntegrationService;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 短信路由网关
 * 短信服务上服务商信息列表是保存在数据库中的，由于这个数据会比较常用，
 * 而每次发送短信之前都需要根据一定的策略来选择服务商，所以在系统启动的时候，
 * 会将所有的短信服务上列表从数据库中加载出来放在内存里，
 * 有一个叫做SmsRouter的类专门去做这个事情
 * 2021-10-11 19:36:22
 */
public class SmsRouter {
    //volatile 保证可见性
    private static volatile SmsRouter instance = new SmsRouter();
    //短信服务商map， key表示 优先级
    private final Map<Integer, SmsInfo> smsInfoRouterMap;

    public SmsRouter() {
        //初始化路由网关信息
        smsInfoRouterMap = this.loadSmsInfoRouteMapFromDb();
    }

    private Map<Integer, SmsInfo> loadSmsInfoRouteMapFromDb() {
        Map<Integer, SmsInfo> routerMap = new HashMap<>();
        routerMap.put(1, new SmsInfo("https://www.aliyun.com", 180L));
        routerMap.put(2, new SmsInfo("https://cloud.tencent.com", 181L));
        routerMap.put(3, new SmsInfo("https://cloud.baidu.com", 182L));
        return routerMap;
    }

    //防止外部修改路由表
    public Map<Integer, SmsInfo> getSmsInfoRouterMap() {
        return Collections.unmodifiableMap(deepcopy(smsInfoRouterMap));
    }

    private Map<Integer, SmsInfo> deepcopy(Map<Integer, SmsInfo> smsInfoRouterMap) {
        Map<Integer, SmsInfo> result = new HashMap<>(smsInfoRouterMap.size());
        for (Map.Entry<Integer, SmsInfo> entry : smsInfoRouterMap.entrySet()) {
            result.put(entry.getKey(), new SmsInfo(entry.getValue()));
        }
        return result;
    }

    public static void setInstance(SmsRouter newInstance) {
        instance = newInstance;
    }

    /**
     * 短信服务商列表变更
     */
    public void changeRouteInfo() {
        //updateDbRouter();
        SmsRouter.setInstance(new SmsRouter());
    }
}
